home *** CD-ROM | disk | FTP | other *** search
- property levelRect, levelLimits, levelSize, srcImage, destrect, screenrect, screensize, halfscreenSize, origin, scrollMember, initialised, startpos, trackMap, leveldata, startAngle, pCollisionGrid, pTrackSpline, pTotalLaps, pSpriteChannel, pLastSprite, pickups, pCurrentPickupNum
- global gOffscreen
-
- on new me
- scrollMember = member("one size pixel")
- screensize = point(520, 320)
- destrect = rect(point(0, 0), screensize)
- halfscreenSize = screensize / 2.0
- scrollMember.image = image(screensize.locH, screensize.locV, 32)
- pSpriteChannel = 100
- pLastSprite = pSpriteChannel + 150
- i = pSpriteChannel
- repeat while i <= (pLastSprite - 10)
- sprite(i).puppet = 1
- sprite(i).loc = gOffscreen
- sprite(i).foreColor = 255
- sprite(i).backColor = 0
- sprite(i).ink = 8
- i = 1 + i
- end repeat
- return me
- end
-
- on initLevel me
- leveldata = script("track_data").getleveldata()
- pTotalLaps = leveldata[#numberLaps]
- srcImage = member("track", "tracks").image
- trackMap = member("trackmap", "tracks").image
- startpos = leveldata[#checkpoints][1][#loc]
- startAngle = leveldata[#checkpoints][1][#angle]
- levelSize = point(srcImage.width, srcImage.height)
- levelRect = rect(point(0, 0), levelSize)
- levelLimits = rect(point(0, 0), levelSize - screensize)
- initialised = 0
- origin = (levelSize / 2.0) - halfscreenSize
- pCollisionGrid = script("collision grid").new(levelSize, point(200, 200))
- i = 1
- repeat while i <= leveldata[#checkpoints].count
- checkPoint = leveldata[#checkpoints][i]
- checkPoint[#number] = i
- pCollisionGrid.addItem(#checkpoints, checkPoint[#pRect], checkPoint)
- i = 1 + i
- end repeat
- pTrackSpline = script("catmull rom spline").new()
- i = 1
- repeat while i <= leveldata[#splinepoints].count
- waypoint = leveldata[#splinepoints][i]
- waypoint[#number] = i
- pTrackSpline.addPoint(i, waypoint[#ploc], waypoint[#pDistance])
- i = 1 + i
- end repeat
- pTrackSpline.calcStats()
- leftbarrier = [#start: point(0, -20), #end: point(0, levelRect.bottom + 20), #normals: [point(1.0, 0.0), point(-1.0, 0.0)]]
- me.createBarrierRect(leftbarrier)
- leveldata[#barriers].add(leftbarrier)
- rightbarrier = [#start: point(levelRect.right - 1, -20), #end: point(levelRect.right - 1, levelRect.bottom + 20), #normals: [point(-1.0, 0.0), point(1.0, 0.0)]]
- me.createBarrierRect(rightbarrier)
- leveldata[#barriers].add(rightbarrier)
- topbarrier = [#start: point(-20, 1), #end: point(levelRect.right + 20, 1), #normals: [point(0.0, 1.0), point(0.0, -1.0)]]
- me.createBarrierRect(topbarrier)
- leveldata[#barriers].add(topbarrier)
- bottombarrier = [#start: point(-20, levelRect.bottom - 1), #end: point(levelRect.right + 20, levelRect.bottom - 1), #normals: [point(0.0, -1.0), point(0.0, 1.0)]]
- me.createBarrierRect(bottombarrier)
- leveldata[#barriers].add(bottombarrier)
- i = 1
- repeat while i <= leveldata[#barriers].count
- barrier = leveldata[#barriers][i]
- barrierRect = barrier[#rect]
- me.addBarrierToCollisionGrid(barrier)
- i = 1 + i
- end repeat
- lastObstacleSprite = pLastSprite - 10
- i = pSpriteChannel
- repeat while i <= lastObstacleSprite
- sprite(i).ink = 8
- i = 1 + i
- end repeat
- i = 1
- repeat while i <= leveldata[#obstacles].count
- obstacle = leveldata[#obstacles][i]
- obstacle[#pRadius] = max(obstacle[#pRect].width, obstacle[#pRect].height) / 2
- obstacle[#pOldLoc] = obstacle[#ploc]
- obstacle[#pRect] = rect(obstacle[#ploc] - obstacle[#pRadius], obstacle[#ploc] + obstacle[#pRadius])
- obstacle[#pVelocity] = point(0.0, 0.0)
- pCollisionGrid.addItem(#obstacles, obstacle[#pRect], obstacle)
- i = 1 + i
- end repeat
- pickups = []
- numPIckups = 0
- diff = min(5, (pTrackSpline.numPoints - numPIckups) / 2)
- pickuplocs = []
- i = 1
- repeat while i <= numPIckups
- newpos = diff + random(pTrackSpline.numPoints - diff)
- repeat while pickuplocs.getPos(newpos) > 0
- newpos = diff + random(pTrackSpline.numPoints - diff)
- end repeat
- pickuplocs[i] = newpos
- i = 1 + i
- end repeat
- maxPickupType = max(1, (3 * numPIckups / 4) - 1)
- pickuptypes = []
- numpickuptypes = [0, 0]
- i = 1
- repeat while i <= numPIckups
- pickuptype = 1
- pickuptype = random(2)
- repeat while numpickuptypes[pickuptype] > maxPickupType
- pickuptype = random(2)
- end repeat
- numpickuptypes[pickuptype] = numpickuptypes[pickuptype] + 1
- pickuptypes.add(pickuptype)
- i = 1 + i
- end repeat
- i = 1
- repeat while i <= numPIckups
- pickupdata = [#type: pickuptypes[i], #ploc: pTrackSpline.pointList[pickuplocs[i]]]
- pickupdata[#pRect] = rect(pickupdata.ploc - point(15, 15), pickupdata.ploc + point(15, 15))
- pickups.add(pickupdata)
- i = 1 + i
- end repeat
- end
-
- on deletePickup me, pickupnum
- if pickupnum <= pickups.count then
- pickups.deleteAt(pickupnum)
- end if
- end
-
- on addBarrierToCollisionGrid me, barrier
- global gLineCollisionTime
- pCollisionGrid.addItem(#barriers, barrier[#rect], barrier)
- end
-
- on createBarrierRect me, thebarrier
- newRect = rect(thebarrier.start, thebarrier.end)
- if newRect.width <= 1 then
- newRect[1] = newRect[1] - 1
- newRect[3] = newRect[3] + 1
- end if
- if newRect.height <= 1 then
- newRect[2] = newRect[2] - 1
- newRect[4] = newRect[4] + 1
- end if
- thebarrier[#rect] = newRect
- end
-
- on getCoursePixel me, loc
- halfloc = loc / 2
- if halfloc.inside(levelRect / 2) then
- return trackMap.getPixel(halfloc, #integer)
- else
- return 128
- end if
- end
-
- on draw me, destinationPos
- if destinationPos.locH < levelLimits.left then
- destinationPos.locH = levelLimits.left
- end if
- if destinationPos.locH > levelLimits.right then
- destinationPos.locH = levelLimits.right
- end if
- if destinationPos.locV < levelLimits.top then
- destinationPos.locV = levelLimits.top
- end if
- if destinationPos.locV > levelLimits.bottom then
- destinationPos.locV = levelLimits.bottom
- end if
- if not initialised then
- initialised = 1
- origin = destinationPos
- else
- if origin <> destinationPos then
- maxcameraSpeed = 35
- maxcameraSpeed = 60
- springDiff = (destinationPos - origin) * 0.40000000000000002
- speedSqr = dotProduct(springDiff, springDiff)
- if speedSqr > (maxcameraSpeed * maxcameraSpeed) then
- springDiff = maxcameraSpeed * (springDiff / sqrt(speedSqr))
- end if
- origin = origin + springDiff
- end if
- end if
- screenrect = rect(point(0, 0), screensize) + rect(origin, origin)
- scrollMember.image.copyPixels(srcImage, destrect, screenrect)
- currentSpriteChannel = pSpriteChannel
- if pickups.count then
- i = 1
- repeat while i <= min(pickups.count, 2)
- set the loc of sprite currentSpriteChannel to pickups[i][#ploc] - origin
- if pickups[i][#type] = 1 then
- set the member of sprite currentSpriteChannel to member("grass")
- else
- set the member of sprite currentSpriteChannel to member("speedup")
- end if
- currentSpriteChannel = currentSpriteChannel + 1
- i = 1 + i
- end repeat
- end if
- if currentSpriteChannel < (pSpriteChannel + 2) then
- i = currentSpriteChannel
- repeat while i <= (pSpriteChannel + 2)
- set the loc of sprite i to gOffscreen
- i = 1 + i
- end repeat
- end if
- obstacleList = pCollisionGrid.getItems(#obstacles, screenrect)
- currentSpriteChannel = pSpriteChannel + 2
- obstaclestart = currentSpriteChannel
- lastObstacleSprite = pLastSprite - 10
- repeat with obstacle in obstacleList
- if currentSpriteChannel <= lastObstacleSprite then
- set the loc of sprite currentSpriteChannel to obstacle.ploc - origin
- set the member of sprite currentSpriteChannel to member(obstacle.ptype, "tracks")
- sprite(currentSpriteChannel).rotation = obstacle.pRotation
- sprite(currentSpriteChannel).locZ = obstacle.pLocz + obstaclestart
- currentSpriteChannel = currentSpriteChannel + 1
- end if
- end repeat
- i = currentSpriteChannel
- repeat while i <= lastObstacleSprite
- set the loc of sprite i to gOffscreen
- i = 1 + i
- end repeat
- currentSpriteChannel = lastObstacleSprite + 1
- oilDropList = pCollisionGrid.getItems(#oil, screenrect)
- repeat with oilDrop in oilDropList
- if currentSpriteChannel <= pLastSprite then
- set the loc of sprite currentSpriteChannel to oilDrop.ploc - origin
- currentSpriteChannel = currentSpriteChannel + 1
- end if
- end repeat
- i = currentSpriteChannel
- repeat while i <= pLastSprite
- set the loc of sprite i to gOffscreen
- i = 1 + i
- end repeat
- end
-
- on addOilDrop me, theloc
- oilDrop = [#pRect: rect(theloc - point(25, 26), theloc + point(25, 26)), #ploc: theloc, #endTime: the milliSeconds + 20000]
- pCollisionGrid.addItem(#oil, oilDrop[#pRect], oilDrop)
- end
-